
#ifndef NODEVALIDATOR_HPP_
#define NODEVALIDATOR_HPP_

#include "../logger/logger.hpp"
#include "parser.hpp"
#include "controlNode.hpp"
#include "../main/graph.hpp"
#include "BaseValidator.hpp"
//#include "../main/graphIterator.hpp"

/**
 * Clase NodeValidator encargada de la validacion de los
 * nodos.
 * Validaciones:
 *  - cantidad de campos
 *  - formato de los campos
 *  - insercion en el grafo (verifica exitencia de nodos
 *  con mismo id, y si existe algun nodo en la misma posicion
 *  que el nodo ingresante)
 *
 */
class NodeValidator : public BaseValidator {
private:
	Logger		*logger;
	Graph		*graph;
	int			numberOfFieldsExpected;
	ControlNode	node;
    int         xMax;
    int         yMax;
    int         xMin;
    int         yMin;

    void validateMinAndMax(int xPosition,int yPosition);
public:

	/**
	 * Constructor por defecto de la clase NodeValidator.
	 */
	NodeValidator(){}

	/**
	 * Constructor parametrizado de la clase NodeValidator.
	 */
	NodeValidator(std::string &fileToParse, Logger *log, Graph *graph);

	/**
	 * Destructor de la clase NodeValidator.
	 */
	virtual ~NodeValidator();

	/**
	 * Generador del contenido de la clase NodeValidator.
	 */
	void create(std::string &fileToParse, Logger *log, Graph *graph);

	/**
	 * Metodo que valida la cantidad de campos del nodo ingresante.
	 * @param lineCount de tipo int.
	 * @param fieldAmount de tipo int.
	 */
	void validateNumberOfFields(int lineCount, int fieldAmount);

	/**
	 * Metodo que valida el tipo del campo del nodo ingresante.
	 * @param lineCount de tipo int.
	 * @param fieldNumber de tipo int.
	 * @param field de clase std::string.
	 */
	void validateField(int lineCount, int fieldNumber, std::string field);

	/**
	 * Metodo que valida la insercion del nodo en el grafo.
	 * @param lineCount de tipo int.
	 */
	void validateElementAdding(int lineCount);

    /**
	 * Metodo getter de la posicion X maxima del grafo.
	 * @return Retorna la posicion X maxima.
	 */
    int getXMax();

    /**
	 * Metodo getter de la posicion Y maxima del grafo.
	 * @return Retorna la posicion Y maxima.
	 */
    int getYMax();
    
    /**
	 * Metodo getter de la posicion X minima del grafo.
	 * @return Retorna la posicion X minima.
	 */
    int getXMin();
    
    /**
	 * Metodo getter de la posicion Y minima del grafo.
	 * @return Retorna la posicion Y minima.
	 */
    int getYMin();
};

#endif /* NODEVALIDATOR_HPP_ */
